/*********************************
*-- 33 KDH Knieja ---------------*
*-- im. Harcerzy Września 1939 --*
*-- autor: Marcin Rzepisko ------*
*-- data: 2013-11-11 ------------*
**********************************/

package net.kdh.knieja.kontroler.impl;

import net.kdh.knieja.dao.impl.ObslugaUzytkownikowDaoImpl;
import net.kdh.knieja.dao.interfejsy.ObslugaUzytkownikowDAO;
import net.kdh.knieja.kontroler.interfejsy.AutoryzacjaUsluga;
import net.kdh.knieja.kontroler.narzedzia.Narzedzia;
import net.kdh.knieja.kontroler.narzedzia.Walidator;
import net.kdh.knieja.model.system.token.Token;
import net.kdh.knieja.model.system.token.TokenAdmina;
import net.kdh.knieja.model.system.token.TokenModa;
import net.kdh.knieja.model.system.token.TokenSuperUsera;
import net.kdh.knieja.model.wspolne.DataCzas;
import net.kdh.knieja.model.wspolne.enumeracje.TypKontaEnum;
import net.kdh.knieja.model.wspolne.wyjatki.BladAutoryzacjiWyjatek;
import net.kdh.knieja.model.wspolne.wyjatki.BladWalidacjiWyjatek;
import net.kdh.knieja.model.wspolne.wyjatki.BladWarstwyDaoWyjatek;

/**
 *
 * @author rz.marcin@gmail.com
 */
public class AutoryzacjaUslugaImpl implements AutoryzacjaUsluga{
private ObslugaUzytkownikowDAO obslugaUzytkownikowDAO = new ObslugaUzytkownikowDaoImpl();

    @Override
    public Token zaloguj(String login, String haslo) throws BladWalidacjiWyjatek, BladAutoryzacjiWyjatek {
        if(haslo == null || login == null || haslo.length() != 32 || login.length() != 32) {
            throw new BladWalidacjiWyjatek("logowanie");
        }
        
        String [] wstepneDane = obslugaUzytkownikowDAO.pobierzPodstawoweDane(login);
        String idUzytkownika = wstepneDane[0];
        TypKontaEnum typKonta = TypKontaEnum.valueOf(wstepneDane[1]);
        
        obslugaUzytkownikowDAO.autoryzuj(idUzytkownika, haslo);
        Token token;
        switch(typKonta) {
            case ADM: {
                token = new TokenAdmina();
                break;
            }
            case MOD: {
                token = new TokenModa();
                break;
            }
            case PWR: {
                token = new TokenSuperUsera();
                break;
            }
            case USR: {
                token = new Token();
                break;
            }
            default: throw new BladWalidacjiWyjatek("logowanie switch");
        }
        token.setDataUtworzenia(DataCzas.biezacaDataCzas());
        token.setDataWygasniecia(DataCzas.nowaDataOdTeraz(4L, 'h'));
        token.setToken(Narzedzia.generujToken());
        token.setIdUzytkownika(idUzytkownika);
        
        try {
            obslugaUzytkownikowDAO.zapiszToken(token);
        } catch (BladWarstwyDaoWyjatek ex) {
            throw new BladWalidacjiWyjatek("logowanie DAO zapiszToken()");
        }
        return token;
    }

    @Override
    public void wyloguj(Token token) throws BladWalidacjiWyjatek{
        new Walidator().weryfikujKlase(token);
        obslugaUzytkownikowDAO.usunToken(token);
    }
    
    @Override
    public void sprawdzToken(Token token) throws BladWalidacjiWyjatek {
        try {
            new Walidator().weryfikujKlase(token);
        } catch (BladWalidacjiWyjatek ex) {
            obslugaUzytkownikowDAO.usunToken(token);
            throw new BladWalidacjiWyjatek("AutoryzacjaUslugaImpl.walidujToken()");
        }
    }    
}
